/**
 * 清空数据
 */
function clearData() {
    // 清空内容
    $("textarea").val("");
    // 清空内容
    $("#content").html("");
}


/**
 * v2管理器对象
 * @type {{parseProtocolUri: ((function(): (any|string|undefined))|*)}}
 */
const v2rayUtil = {
    /**
     * 解析协议
     * @param protocolStr
     * @returns {any|string}
     */
    parseProtocolUri: function (protocolStr){
        // 移除前缀
        const prefix = `vmess://`;
        if (protocolStr.startsWith(prefix)) {
            protocolStr = protocolStr.replace(prefix, "");
        }else {
            return "协议前缀错误";
        }

        // Base64解码
        try {
            const decodedBytes = window.atob(protocolStr);
            // JSON解析
            return decodedBytes.toString();

        }catch (e) {
            return "解析协议地址有误";
        }
    }
};


/**
 * 基础工具
 * @type {{is_json: ((function(*): boolean)|*)}}
 */
const BaseUtil = {
    /**
     * 判断是否是json
     * @param json_str
     * @param is_pre
     * @returns {*|boolean}
     */
    is_json: function(json_str, is_pre=false) {
        if (typeof json_str == 'string') {
            try {
                var json_data = JSON.parse(json_str);
                if(typeof json_data == 'object' && json_data ){
                    //
                }else{
                    return json_str;
                }
            } catch(e) {
                return json_str;
            }
            if (is_pre){
                var formatter = new JSONFormatter(json_data);
                return formatter.render();
            }
            return obj;
        }else{
            return json_str;
        }
    },

    /**
     * 字符串去转义
     * @param unescape_str
     * @returns {*}
     */
    unescape: function(unescape_str) {
        try {
           return unescape_str.replace(/\\(["'\\/bfnrt])/g, '$1');
        }catch (e) {
            return e;
        }
    },

    /**
     * 复制内容
     * @param copy_str
     */
    copy_content: function(copy_str){
        navigator.clipboard.writeText(copy_str).then(() => {
                        layer.msg("复制成功");
                        layer.closeAll();
                      },() => {
                        layer.msg("复制失败");
                      });
    }
}


/**
 * 定义函数对象
 * @type {{vmess_btn1: functions.vmess_btn1, json_btn1: functions.json_btn1, json_btn2: functions.json_btn2, clear_btn: functions.clear_btn, copy_btn: functions.copy_btn}}
 */
const functions = {
    /**
     * 清空按钮
     */
    clear_btn: function() {
        clearData();
    },
    /**
     * 复制内容按钮
     */
    copy_btn: function() {
        BaseUtil.copy_content($("#content").text())
    },
    /**
     * vmess 解析
     * @param field
     */
    vmess_btn1: function(field) {
        let json_data = v2rayUtil.parseProtocolUri(field["content"]);
        $("#content").html(BaseUtil.is_json(json_data, true));
    },
    /**
     * json格式化
     * @param field
     */
    json_btn1: function(field) {
        $("#content").html(BaseUtil.is_json(field["content"], true));
    },
    /**
     * 去字符串转义
     * @param field
     */
    json_btn2: function(field) {
        $("#content").html(BaseUtil.unescape(field["content"]));
    }
};

/**
 * aigc工具包
 * @type {{
 *  发送消息: aigcFunction.send_message
 *}}
 */
const aigcFunction = {
    /**
     * 发送消息
     * @param message
     */
    send_message: function(message) {
        var chatBody = $('#chat-body');
        // 构建问题数据
        var questionHtml = '<div class="chat-message chat-message-left"><span class="sender">You:</span><span class="text">' + message + '</span></div>';
        chatBody.append(questionHtml);
        // 清空问题框
        $('#message').val('');
        // 等待答案数据
        layer.load(0);
        $.ajax({
            url: '/aigc/send_message',
            type: 'POST',
            data: JSON.stringify({"type": "1", "message": message}),
            success: function (response) {
                console.log("-----------", response);
                layer.closeAll();
                // 构建答案数据
                response.data.forEach((item)=>{
                    let answerHtml = '<div class="chat-message chat-message-left"><div class="author">' + item.name + '：</div><div class="text">' + item.value + '</div></div>';
                    chatBody.append(answerHtml);
                });
            }
        });

        // 滚动到最下面
        chatBody.scrollTop(chatBody[0].scrollHeight);

    }
}

/**
 * 阅读器工具包
 * @type {{
 *  初始化函数: myAudio.init,
 *  设置播放地址: myAudio.set_url,
 *  开始后触发任务: myAudio.start_function,
 *  暂停后触发任务: myAudio.pause_function,
 *  结束后触发任务: myAudio.ended_function,
 *  播放位置发生变化: myAudio.timeupdate_function
 *}}
 */
const myAudio = {
    audio : null,
    // 初始化
    init : function(){
        // 判断页面是否已经存在audio标签
        this.audio = document.getElementById('audioElement');
        if(this.audio == null){
            // 创建audio标签
            this.audio = document.createElement('audio');
            this.audio.setAttribute('id', 'audioElement');
            this.audio.setAttribute('src', '');
        }
    },
    // 设置播放地址
    set_url : function(url){
        this.init();
        // 设置播放地址
        this.audio.setAttribute('src', url);
    },
    // 实时触发
    timeupdate_function : function(func){
        this.audio.addEventListener('timeupdate', function() {
            func();
        });
    },
    // 开始播放 当音频的元数据加载完成时触发。
    start_play:function(func){
        this.audio.addEventListener('loadedmetadata', function(){
            console.log("音频数据加载完成");
            func();
        });
    },
    // 开始后触发任务
    start_function: function(func){
        this.audio.addEventListener('play', function(){
            console.log("音频开始播放");
            func();
        });
    },
    // 暂停后触发任务
    pause_function: function(func){
        this.audio.addEventListener('pause', function(){
            console.log("音频暂停");
            func();
        });
    },
    // 结束后触发任务
    ended_function: function(func){
        this.audio.addEventListener('ended', function(){
            console.log("音频播放完毕");
            func();
        })
    },
    // 获取当前总时长
    get_duration: function(){
        if(this.audio == null || this.audio.getAttribute('src') == null){
            return -1;
        }
        return this.audio.duration; 
    },
    // 获取当前总时长
    get_now_duration: function(){
        if(this.audio == null || this.audio.getAttribute('src') == null){
            return -1;
        }
        return this.audio.currentTime; 
    },
    // 结束任务
    stop_function: function(){
        if(this.audio && this.audio.getAttribute('src') != null){
            // 触发结束事件
            this.audio.pause();
            this.audio.currentTime = 0;
            this.audio.removeAttribute('src');

            this.audio = null;
        }
    },
    // 播放位置发生变化
    timeupdate_function: function(){
        let that = this;
        this.audio.addEventListener('timeupdate', function(){
            console.log("当前状态, 当前时间", that.audio.currentTime, "--- 总时长", that.audio.duration, "---", that.audio.readyState);
        })
    },
    // 修改状态
    update_status: function(){
        if(this.audio == null || this.audio.getAttribute('src') == null){
            return false;
        }
        // 停止
        if(this.audio.ended){
            return false;
        }
        // 暂停、播放
        if (this.audio.paused){
            this.audio.play();
        }else{
            this.audio.pause();
        }
        return true;
    }
};

/**
 * 内容滚动工具包
 */
const contentScrollUtils = {
    now_index: 0,
    div: null,
    // 开始滚动
    all_start_fun : function(div, pList, start_func=function(){}, end_func=function(){}){
        this.div = div;
        let that = this;
        // 刚开始
        var animated = this.div.is(':animated'); // 滚动状态
        if(animated){
            $("#scrollbutton").text("继续滚动");
            this.div.clearQueue().stop();
            return true;
        }else{
            $("#scrollbutton").text("停止滚动");
        }

        // 自动滚动
        for(let i = that.now_index; i < pList.length; i++){
            let p = $(pList[i]);
            // 偏差值
            let deviation = this.div.height() * 20 / 100;
            // 开始滚动
            let top = p.offset().top - this.div.offset().top + this.div.scrollTop() - deviation;
            setTimeout(function() {
                // 动画滑动
                that.div.animate({ scrollTop: top }, {
                    duration: 2000, 
                    start:function(){
                        p.css("color", "red");
                        that.now_index = i;

                        start_func();
                    }, 
                    complete:function(){
                        $("#chapter-content>div>p").css("color", "white");
                        // 最后一张，停止计数
                        if(that.now_index == pList.length-1){
                            that.now_index = 0;
                        }
                        end_func();
                    }
                });
            }, 500);
    }
    },
    // 单个定位
    sign_start_fun : function(div, p, time){
        // 滚动距离
        let top = p.offset().top - div.offset().top + div.scrollTop() - div.height() * 20 / 100;

        console.log("address",  p.text(), p.offset().top, div.offset().top, div.scrollTop(),  div.height() * 20 / 100);

        div.animate({ scrollTop: top }, {
            duration: time, 
            start:function(){
                // $("#chapter-content>div>p").css("color", "white");
                p.css("color", "red");
            }
        });

        // div.scrollTop(top);
        
    }
};